function requestFun(app) {
    /**
     * 公共请求方法
     * @param {string} path - 请求的路径
     * @param {object} data - 请求的数据
     * @param {string} method - 请求方法，如 'GET'、'POST'
     * @param {object} header - 请求头
     * @param {function} success - 请求成功的回调函数
     * @param {function} fail - 请求失败的回调函数
     * @param {function} complete - 请求完成的回调函数
     */
    const commonRequest = (path, data, method, header, success, fail, complete) => {
        data = data || {};
        data.appId = app.config.globalProperties.getAppId();
        if (method !== 'GET') {
            data.token = uni.getStorageSync('token') || '';
        }

        uni.request({
            url: app.config.globalProperties.websiteUrl + '/api/front/' + path,
            data: data,
            dataType: 'json',
            method: method,
            header: header,
            success: (res) => {
                if (res.statusCode !== 200 || typeof res.data !== 'object') {
                    console.error('请求返回异常状态码或非对象数据', res);
                    return false;
                }
                if (res.data.code === -2) {
                    app.config.globalProperties.showError(res.data.msg, function () {
                        uni.removeStorageSync('token');
                        // this.gotoPage('/pages/index/index', 'reLaunch');
                    });
                } else if (res.data.code === -1) {
                    // 登录态失效, 重新登录
                    console.log('登录态失效, 重新登录');
                    app.config.globalProperties.doLogin();
                } else if (res.data.code === 0) {
                    app.config.globalProperties.showError(res.data.msg, function () {
                        fail && fail(res);
                    });
                    return false;
                } else if (res.data.code === 10) {
                    /* 店铺不存在 */
                    app.config.globalProperties.showError(res.data.msg, function () {
                        uni.removeStorageSync('selectedId');
                        uni.reLaunch({
                            url: '/pages/index/index'
                        });
                    });
                    return false;
                } else {
                    success && success(res.data);
                }
            },
            fail: (res) => {
                console.error('请求失败', res);
                fail && fail(res);
            },
            complete: (res) => {
                uni.hideLoading();
                complete && complete(res);
            },
        });
    };

    /**
     * @description get请求
     * @param {string} path - 请求的路径
     * @param {object} data - 请求的数据
     * @param {function} success - 请求成功的回调函数
     * @param {function} fail - 请求失败的回调函数
     * @param {function} complete - 请求完成的回调函数
     */
    app.config.globalProperties._get = function (path, data, success, fail, complete) {
        data.token = uni.getStorageSync('token') || '';
        console.log(this.websiteUrl, "token:", data.token);
        commonRequest(path, data, 'GET', {
            'appId': this.getAppId()
        }, success, fail, complete);
    };

    /**
     * @description post请求，使用 application/x-www-form-urlencoded
     * @param {string} path - 请求的路径
     * @param {object} data - 请求的数据
     * @param {function} success - 请求成功的回调函数
     * @param {function} fail - 请求失败的回调函数
     * @param {function} complete - 请求完成的回调函数
     */
    app.config.globalProperties._post = function (path, data, success, fail, complete) {
        commonRequest(path, data, 'POST', {
            'content-type': 'application/x-www-form-urlencoded',
            'appId': this.getAppId()
        }, success, fail, complete);
    };

    /**
     * @description post请求，使用 application/json;charset=UTF-8
     * @param {string} path - 请求的路径
     * @param {object} data - 请求的数据
     * @param {function} success - 请求成功的回调函数
     * @param {function} fail - 请求失败的回调函数
     * @param {function} complete - 请求完成的回调函数
     */
    app.config.globalProperties._postBody = function (path, data, success, fail, complete) {
        commonRequest(path, data, 'POST', {
            'content-type': 'application/json;charset=UTF-8',
            'token': uni.getStorageSync('token') || ''
        }, success, fail, complete);
    };

    /**
     * @description 登录失效 重新登录
     * @param
     * @returns
     */
    app.config.globalProperties.doLogin = function () {
        let pages = getCurrentPages();
        if (pages.length) {
            let currentPage = pages[pages.length - 1];
            if ("pages/login/login" != currentPage.route &&
                "pages/login/weblogin" != currentPage.route &&
                "pages/login/openlogin" != currentPage.route) {
                uni.setStorageSync("currentPage", currentPage.route);
                uni.setStorageSync("currentPageOptions", currentPage.$page.options);
            }
        }
        console.log('appId=' + this.getAppId());
        // 公众号
        // #ifdef  H5
			this.gotoPage("/pages/login/weblogin", 'redirect');
			return;
        // #endif
        // #ifdef APP-PLUS
			this.gotoPage("/pages/login/openlogin", 'redirect');
			return;
        // #endif
        // 非公众号,跳转授权页面
        // #ifndef  H5
        /*
             wxOpen true 开启微信授权 false 不开启微信授权
         */
        this.gotoPage("/pages/login/login");
        // #endif
    };
}

export default requestFun;